#include "game2.h"
void menu( )
{
    printf("*****************************\n");
    printf("******     1.Play     *******\n");
    printf("******     0.Exit     *******\n");
    printf("*****************************\n");
}

void game( )
{
    char arr1[ROWS][COLS]={0};//存储雷
    char show[ROWS][COLS]={0};//展示信息
    csh_table(arr1,ROWS,COLS,'0');//初始化棋盘
    csh_table(show,ROWS,COLS,'*');//初始化棋盘
    set_boom(arr1,ROW,COL,Bnumber);//设置雷
    dy_table(show,ROWS,COLS);//打印棋盘
    find_boom(arr1,show,ROW,COL);//排查雷
}

void csh_table(char arr[ROWS][COLS],int rows,int cols,char t)//初始化棋盘
{
    int i=0,j=0;
    for(i=0;i<rows;i++)
    {
        for(j=0;j<cols;j++)
        {
            arr[i][j]=t;
        }
    }
}
void dy_table(char arr[ROWS][COLS],int rows,int cols)
{
    int i=0,j=0;
    printf("                                           \n");
    printf("—————————》扫雷游戏《—————————\n");

    /*for(i=0;i<rows-1;i++)
    {
        for(j=0;j<cols-1;j++)
        {
            if(i==0&&j==0)
                printf("   ");
            if(i==0&&j!=0)
                printf("%-3d",j);
            else if(j==0 && i!=0)
                    printf("%-3d",i);
            else if(i!=0&&j!=0)
                printf("%-3c",arr[i][j]);
        }
    printf("\n");
    }*///另一种实现编号的方法
    for(j=0;j<cols-1;j++)
    {
        printf("%-3d",j);//%3d表示输出自定字符并使其占据3个字符的宽度，加上-，%-3d代表使其居中显示。
    }
    printf("\n");
  for(i=1;i<rows-1;i++)
    {
    printf("%-3d",i);
        for(j=1;j<cols-1;j++)
        {
            printf("%-3c",arr[i][j]);
        }
    printf("\n");
    }
    printf("—————————》扫雷游戏《—————————\n");
    printf("                                           \n");
}

void set_boom(char arr[ROWS][COLS],int row,int col,int b)
{
    int i=0,j=0;
    while(b)//用随机数生成炸弹坐标，b为炸弹数。
    {
        i=rand()%row+1;
        j=rand()%col+1;
        if(arr[i][j]=='0')//判断是否重复放雷
        {
            arr[i][j]='1';
            b--;
        }
    }
}

void find_boom(char arr1[ROWS][COLS],char arr2[ROWS][COLS],int row,int col)
{
    int win=0,i=0,j=0;
    while(1)
    {
        int aa=0,bb=0;
        printf("请输入排查坐标\n"); 
        scanf("%d %d",&aa,&bb);
        if(aa>=1&&aa<=row&&bb>=1&&bb<=col)
        {
            if(arr1[aa][bb]=='1')
            {
                dy_table(arr1,ROWS,COLS);//打印棋盘
                printf("踩到炸弹，你输了！\n"); 
                printf("                                           \n");
                printf("—————————》扫雷游戏《—————————\n");
                break;
            }
            get_boom(arr1,arr2,aa,bb);//
            dy_table(arr2,ROWS,COLS);//打印棋盘显示排查信息
            //dy_table(arr1,ROWS,COLS);//打印棋盘
            for(i=1;i<=row;i++)
            {
                for(j=1;j<=col;j++)
                {
                    if(arr2[i][j]=='*')
                    win++;//计数器
                }
            }
            if(win==Bnumber)
            break;
            else win=0;//计数器置零
        }

    else 
        printf("坐标输入错误，请重新输入！\n"); 
    }
    if(win==(Bnumber))
        {
            printf("恭喜你获得胜利！！\n");  
            printf("                                           \n");
            printf("—————————》扫雷游戏《—————————\n");
        }
}

void get_boom(char arr1[ROWS][COLS],char arr2[ROWS][COLS],int row,int col)//获取周围炸弹数
{
    int i=0,j=0,count1=0,count2=0;
    if(arr1[row][col]!=1)
    {
        for(i=row-1;i<=row+1;i++)
        {
            for(j=col-1;j<=col+1;j++)
            {
                if(arr1[i][j]=='1')
                count1++;
                else
                count2++;
            }
        }
        arr2[row][col]=count1+'0';//将int类型的get_b中的值转化为字符并赋予到展示数组中
        if(count2==9)
        {
            for(int zr=row-1;(zr<=row+1);zr++)
            {
                for(int zc=col-1;(zc<=col+1);zc++)
                {
                if(zr>=1&&zr<=ROW&&zc>=1&&zc<=COL&&arr2[zr][zc]!='0')
                {
                    get_boom(arr1,arr2,zr,zc);//递归求解周围炸弹数
                }//arr2[zr][zc]!='0'避免重复计算造成死循环
                }
            }
        }
    }

}

